package com.xuebusi.orm.mybatis.reflection;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 * 反射工具类
 *
 * @author ys
 */
public class ReflectionUtil {
    /**
     * 为指定的beanpropName属性的值设置为value
     *
     * @param bean    目标对象
     * @param proName 对象的属性名
     * @param value   值
     */
    public static void setPropToBean(Object bean, String proName, Object value) {
        Field f;
        try {
            //获取对象指定的属性
            f = bean.getClass().getDeclaredField(proName);
            //将字段设置为可通过反射访问
            f.setAccessible(true);
            //为属性赋值
            f.set(bean, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 从resultSet中读取一行数据，并填充到指定的实体bean
     *
     * @param entity    待填充的实体bean
     * @param resultSet 从数据库中加载的数据
     * @throws SQLException
     */
    public static void setPropToBeanFromResultSet(Object entity, ResultSet resultSet) throws SQLException {
        //通过反射获取对象的所有字段
        Field[] declaredFields = entity.getClass().getDeclaredFields();
        //遍历所有的字段，从resultSet中读取相应的电话机，并填充至对象的属性中
        for (int i = 0; i < declaredFields.length; i++) {
            //如果是字符串类型的数据
            if (declaredFields[i].getType().getSimpleName().equals("String")) {
                setPropToBean(entity, declaredFields[i].getName(), resultSet.getString(declaredFields[i].getName()));
                //如果是int类型
            } else if (declaredFields[i].getType().getSimpleName().equals("Integer")) {
                setPropToBean(entity, declaredFields[i].getName(), resultSet.getInt(declaredFields[i].getName()));
                //如果是long类型数据
            } else if (declaredFields[i].getType().getSimpleName().equals("Long")) {
                setPropToBean(entity, declaredFields[i].getName(), resultSet.getLong(declaredFields[i].getName()));
            }
        }
    }
}